iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
佛心分享-刷題不只是刷題

30 天克服前端面試系列 第 30

Day 30 - Interface 和 Type 的差別

  • 分享至 

  • xImage
  •  

TypeScript 中 Interface 和 Type 的差別有以下幾點:
這題在面某知名電腦大廠有被問過

1.TypeScript 編譯器推論結果不同

Type

宣告 Type 時,所使用的名稱代表的是其背後的型別結構

type Person = {
  name: string;
  age: number;
  gender: string;
};
type Employee = Person;

/**
 * TypeScript 編譯器推論結果為:
 * type Employee =
 * {
 *   name: string;
 *   age: number;
 *   gender: string;
 * }
 **/

Interface

Interface 介面宣告時會使用名稱代表 TypeScript 編譯器推論的結果

interface Person {
  name: string;
  age: number;
  gender: string;
}
type Employee = Person; // TypeScript 編譯器推論結果為: type Employee = Person

2.Type 和 Interface 的擴展性差異

Type

Type 較適合靜態、變動性較小的資料結構,並且可以表達任一型別。

type Phone = {
  brand: string;
  model: string;
  price: number;
};

雖然 Type 無法擴充,但可以使用交集運算子 & 來合併多個 Type。
然而,與 Interface 不同的是,Type 不能進行重新開放(declaration merging),這意味著無法多次聲明一個 Type 來合併屬性。

type Person = {
  name: string;
};

type Employee = Person & {
  salary: number;
};

另外,Type 不僅限於物件也可以用於其他型別的別名,像是聯合型別、函數型別、原始型別等。

// 原始型別別名

type StringAlias = string;

// 聯合型別
type UnionType = string | number;

// 函數型別
type FunctionType = (a: number, b: number) => number;

Interface

Interface 的宣告較為靈活,可以用來描述物件、函式、類別、JSON物件等...,並且可以自由的進行擴充。

interface Person {
  name: string;
}

interface Person {
  age: number;
}

// 合併後的 Person 會包含 name 和 age 屬性
const person: Person = {
  name: "John",
  age: 30,
};

Interface 支持宣告合併(declaration merging),這表示可以多次宣告同一個 Interface,並且 TypeScript 會將它們合併。

interface Phone {
  brand: string;
  model: string;
  price: number;
}

interface SmartPhone extends Phone {
  os: string;
}

本文同步於此


終於完成了第二次的鐵人賽,真的很不容易,雖然這次寫的內容沒有上次豐富,就單純前端面試的八股文而已,但這次沒什麼備稿,幾乎是下班回家從頭開始寫,壓線才提交文章,超累~不過至少有好好地複習了 Javascript 和一些前端的知識點,也希望對剛好有看到這系列文章的讀者有所幫助。


上一篇
Day 29 - 手寫 debounce 防抖函式和 throttle 節流函式
系列文
30 天克服前端面試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
毛哥EM
iT邦新手 2 級 ‧ 2024-10-15 11:04:33

恭喜完賽!

Ashley iT邦新手 4 級 ‧ 2024-10-17 22:06:37 檢舉

謝謝!

我要留言

立即登入留言